/*
 * @Author: lyx 2858535420@qq.com
 * @Date: 2022-10-10 22:31:07
 * @LastEditors: lyx 2858535420@qq.com
 * @LastEditTime: 2023-04-27 11:03:13
 * @FilePath: /bangand-low-code/src/directives/modules/action.js
 * @Description: 
 * Action 权限指令
 * 指令用法：
 *  
 * // todo: 可以根据自己项目的内容修改逻辑
 * 
 *  - 在需要控制 action 级别权限的组件上使用 v-auth:[method] , 如下：
 *    <a-button v-auth:add >添加用户</a-button>
 *    <a-button v-auth="'add'" >添加用户</a-button>
 *    <a-button v-auth="['add']" >添加用户</a-button>
 *
 *  - 当前用户没有权限时，组件上使用了该指令则会被隐藏
 *  - 当后台权限跟 pro 提供的模式不同时，只需要针对这里的权限过滤进行修改即可
 *
 */

import store from '@/store';
import { objectUtils } from '@/utils/index';

function checkPermission(el, binding) {
  // 指令可以是一个字符串，也可以是一个数组
  let actionName = binding.arg || binding.value,
    auths = store.getters?.roles?.permissions || [],
    bindAuths = objectUtils.isString(actionName) ? [actionName] : actionName;

  const hasAuth = auths.map(v => v.actionList).flat().some(action => {
    return bindAuths.includes(action);
  });

  if (!!hasAuth) return;
  el.parentNode && el.parentNode.removeChild(el) || (el.style.display = 'none');
}

export default {
  inserted(el, binding, vnode) {
    checkPermission(el, binding);
  },
  update(el, binding) {
    checkPermission(el, binding);
  }
};
